<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 数组的api：
    *   .length:数组的长度（可读取，可修改的属性）
    *   .concat:
    *       方法:可以传数组，也可以传多个单独的值
    *   .copyWithin:浅拷贝
    *
    *   数组的头尾插入删除
    *       数组的尾部 插入元素
    *           .push 数组的一个属性 不是变量 是两个完全不同的概念
    *               可以接收一个或多个参数，按先来后到顺序插入数组尾部，插入顺序和传入参数的顺序一致
    *               返回值：返回数组的最新的长度
    *           let arr = ["喜羊羊","若水"]
    *           arr.push([1]) //arr变成["喜羊羊","若水",[1]]
    *           arr.push(...[3,4]) //arr变成["喜羊羊","若水",[1],"3","4"]
    *           arr.push(...[3,4],...[5,6]) //arr变成["喜羊羊","若水",[1],"3","4","5","6"]
    *
    *           自己封装一个push方法
    *           通过结构：
    *           function push1(arr,...rest){//前面是原数组 后面是需要添加的若干新元素
    *               let length = rest.length //新元素的长度
    *               let oldLength = arr.length //原数组的长度
    *               arr.length += length //最新的数组长度等于原数组的长度 + 新元素的长度
    *               //i是循环的开始下标;i<arr.length是循环的终止条件;后者减去前者就是循环的次数
    *               for(let i = oldLength;i < arr.length;i++){//遍历从原数组的最后一项开始挨个添加新元素rest，一直循环添加到最新数组的长度
    *                   arr[i] = rest[i - oldLength] //挨个给新元素下标添加内容 因为i一开始表示的是原数组的末尾下标 并不是从零开始的下标
    *                                                //所以要将 新元素第0位下标对应的值 赋值给 新数组（在原数组长度后）新增的第1位
    *                                                //新元素要借用i作为下标进行遍历 就要将i的值变为0 就需要减去原数组的长度 这样才是新元素的长度开始下标
    *               }
    *               return arr.length
    *           }
    *
    *           通过arguments
    *           function push2(arr){
    *               //arguments 参数对象 包括原数组arr（第0位）在内 所以如果添加原数组以外的新元素 要从下标为1开始 一直到下标为arguments.length-1结束
    *               let length = arguments.length - 1 //插入元素的数组长度
    *               let oldLength = arr.length //原数组的数组长度
    *               arr.length += length //修改原数组的长度 使其增加需要的新内容 这样后面就多了length个empty来占位
    *               for(let i = oldLength;i < arr.length;i++){ //写一个循环 循环length次 将新内容依次添加原数组(除外)尾部
    *                   //这个循环是从原数组的结束位置开始 到新数组的结束位置结束 中间循环的全是新添加的empty 再将empty所对应下标进行循环赋值
    *                   arr[i] = arguments[i - oldLength + 1] //i-oldLength之后，下标就变成0 但是arguments包括原数组arr（第0位）
    *                                                         //所以要加一位 将原数组的下标排除之后再添加的才是剩余参数
    *               }
    *               return arr.length
    *           }
    *
    *           let arr = ["喜羊羊","若水"]
    *           console.log(push1(arr,23,45,...[6,7,8]))
    *           console.log(push2(arr,23,45,...[6,7,8]))
    *
    *           数组最后插入新元素的原本写法
    *           let arr = ["喜羊羊","若水"]
    *           arr.length = arr.length + 1
    *           arr[arr.length - 1] = "大哥"
    *
    *       数组的尾部 删除元素
    *           .pop
    *           pop方法不接收参数 arr.pop //一次只在尾部删除最后一个 要多删除请自行封装（作业）
    *           返回值：返回 字符串形式的被删除元素
    *
    *       数组的头部 插入元素
    *           .unshift
    *           参数：可以接收一个或多个参数，按先来后到顺序插入数组头部，插入顺序和传入参数的顺序一致
    *           返回：返回数组的最新的长度
    *
    *       数组的头部 删除元素
    *           .shift
    *           参数：不接收参数
    *           返回：返回 字符串形式的被删除元素
    *           思考一下：
    *           arr = [] //一个空数组
    *           arr.shift() //返回什么？返回undefined 删除一个不存在的属性 就只能返回undefined
    *
    *
    *       数组的头尾插入删除其实是一种数据结构：
    *           队列：[]
    *
    *           添加操作：对应数组push方法
    *           执行完下一个执行：对应数组shift方法
    *
    *       颠倒数组：
    *       .reverse
    *       如：
    *       let arr = ["喜羊羊","若水","你大哥","枫叶"]
    *       arr.reverse()
    *       参数：不接收参数
    *       修改的是原数组
    *       返回值：返回颠倒后的排序结果（注意返回的还是原数组，只是顺序变了，但是还是原来的引用地址不能变！！！）
    *
    *       封装reverse方法
    *       //这是典型的错误
    *       function reverse(arr){
    *           let newArr = []
    *           for(let i = 0;i < arr.length;i++){
    *               newArr.unshift(arr[i])
    *           }
    *           return newArr //错误一：更改与返回的都是新的数组（新的引用地址），我们原本的想法是改变原来数组的顺序而已，而不是把引用地址给改了
    *       //错误二：我们原来的目的并没有达到，原来的数组并未发生我们想要的变化顺序
    *       }
    *
    *
    *       正确的写法：
    *       function reverse(arr){
    *           let newArr = []
    *           //这个循环是在 将原数组的内容拷贝一份
    *           for(i = 0;i < arr.length;i++){
    *               newArr[i] = arr[i]
    *           } //这里的新数组拥有和原数组一样的值 但是只是用来做参考数据的中介
    *
    *           for(i = 0;i < arr.length;i++){
    *               arr[i] = newArr[(arr.length - 1) - i] //(arr.length - 1)表示最后一位的下标
    *           } //arr第0位的值 等于 newArr最后一位 - 0下标 所对应的值 还是最后一位
    *             //arr第1位的值 等于 newArr最后一位 - 1下标 所对应的值 倒数第二位的值 以此类推
    *           return arr //返回的还是原来的arr 还是原来的引用地址
    *       }
    *
    *
    *
    * */





</script>
</body>
</html>